#!/bin/bash
# =================================================================
# 实现功能
# 每天自动备份 GitLab 数据、配置和日志
# 保留最近 N 天的备份，自动清理过期
# 可选上传到远程存储，之前是rsync，现在新增S3/FTP
# 按日期生成归档目录，便于管理
# =================================================================

# =================================================================
# GitLab Docker 自动化备份脚本
# =================================================================

# ------------------------------
# 配置部分
# ------------------------------
CONTAINER_NAME="gitlab"            # GitLab 容器名
BACKUP_BASE="./all_backup"         # 本地备份目录
TAR_DIR="./data/backups"           # GitLab 数据目录
CONFIG_DIR="./config"              # GitLab 配置挂载目录
LOG_DIR="./logs"                   # GitLab 日志挂载目录
KEEP_DAYS=7                        # 保留最近几天的备份
HISTORY_FILE="./backup_list.txt"   # 备份文件列表

# 远程上传配置（可选）
UPLOAD_REMOTE=false                 # 是否上传到远程（true/false）
REMOTE_TYPE="s3"                    # s3 或 ftp
REMOTE_BUCKET="s3://your-bucket-name/gitlab-backups"  # S3 桶路径
REMOTE_FTP_HOST="ftp.example.com"   # FTP 主机
REMOTE_FTP_USER="user"
REMOTE_FTP_PASS="password"
REMOTE_PATH="/backups/gitlab"      # FTP 路径
REMOTE_RSYNC_USER="backupuser"
REMOTE_RSYNC_HOST="192.168.1.10"
REMOTE_RSYNC_DIR="/data/gitlab_backup"


# ------------------------------
# 日期变量
# ------------------------------
DATE=$(date +%F)
BACKUP_DIR="$BACKUP_BASE/$DATE"
mkdir -p "$BACKUP_DIR"

echo "[$(date '+%F %T')] 开始备份 GitLab..."


# 获取备份前的文件列表
docker exec "$CONTAINER_NAME" bash -c "ls /var/opt/gitlab/backups/*.tar" > "$HISTORY_FILE"

# ------------------------------
# 1.备份数据库和仓库
# ------------------------------
echo "[$(date '+%F %T')] 备份 GitLab 数据库和仓库..."
docker exec -t "$CONTAINER_NAME" gitlab-backup create

# 获取最新备份文件
LATEST_FILE=$(docker exec "$CONTAINER_NAME" bash -c "ls -1t /var/opt/gitlab/backups/*_gitlab_backup.tar* | head -n1")

# 校验是否为新文件
if grep -q "$(basename "$LATEST_FILE")" "$HISTORY_FILE"; then
    echo "❌ 备份失败：未生成新备份文件"
    exit 1
else
    echo "✅ 新备份文件: $LATEST_FILE"
    echo "$(basename "$LATEST_FILE")" >> "$HISTORY_FILE"
    cp -a "$TAR_DIR/$(basename "$LATEST_FILE")" "$BACKUP_DIR/"
fi

# ------------------------------
# 2.备份配置文件
# ------------------------------
echo "[$(date '+%F %T')] 备份配置文件..."
tar -czf "$BACKUP_DIR/gitlab_config_$DATE.tar.gz" -C "$CONFIG_DIR" .

# ------------------------------
# 3.备份日志
# ------------------------------
echo "[$(date '+%F %T')] 备份日志..."
tar -czf "$BACKUP_DIR/gitlab_logs_$DATE.tar.gz" -C "$LOG_DIR" .

# ------------------------------
# 4.删除过期备份
# ------------------------------
echo "[$(date '+%F %T')] 清理 $KEEP_DAYS 天前的旧备份..."
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;
